import javax.imageio.stream.ImageInputStream;
import java.util.Scanner;

//作业
public class Test {
    //1.创建方法求两个数的最大值max2，随后再写一个求3个数的最大值的函数max3。
    //要求：在max3这个函数中，调用max2函数，来实现3个数的最大值计算
//    public static int max2(int x, int y){
//        return (x > y) ? x : y;
//    }
//
//    public static int max3 (int num1, int num2, int num3) {
//        int maxOffFirstTwo = max2(num1, num2);
//        return max2(maxOffFirstTwo, num3);
//
//    }
//
//    public static void main(String[] args) {
//        int a = 10;
//        int b = 20;
//        int c = 30;
//        int maxValue = max3(a, b, c);
//        System.out.println(maxValue);
//    }

    //2.求N的阶乘
//    public static int fac(int n){
//        int ret = 1;
//        while(n > 0){
//            ret *= n;
//            n--;
//        }
//        return ret;
//    }
//    public static int fac2(int n){
//        int ret = 1;
//        if (n == 1){
//            return 1;
//        }
//        ret = n * fac2(n - 1);
//        return ret;
//    }
//
//    public static void main(String[] args) {
//        Scanner scanner = new Scanner(System.in);
//        System.out.println("请输入要求阶乘的数");
//        int num = scanner.nextInt();
//        int ret = fac2(num);
//        System.out.println(ret);
//    }

    //求1！+2！+3！+4！+........+n!的和
//    public static int fac(int n) {
//        int ret = 1;
//        if (n == 1) {
//            return 1;
//        }
//        return n * fac(n - 1);
//    }
//
//    public static int facSum(int n){
//        int sum = 0;
//        while (n > 0) {
//            sum += fac(n);
//            n--;
//        }
//        return sum;
//    }
//
//    public static void main(String[] args) {
//        Scanner scanner = new Scanner(System.in);
//        System.out.println("请输入要求到的阶乘的数");
//        int num = scanner.nextInt();
//        int sum = facSum(num);
//        System.out.println(sum);
//    }


    //求斐波那契数列的第n项。(迭代实现)
//    public static int fib(int n){
//        int num1 = 1;
//        int num2 = 1;
//        int ret = 0;
//        while (n >= 3){
//            ret = num1 + num2;
//            num1 = num2;
//            num2 = ret;
//            n--;
//        }
//        return ret;
//    }
//
//    public static void main(String[] args) {
//        int n = 5;
//        int ret = fib(n);
//        System.out.println(ret);
//    }


    //方法的重载
    //在同一个类中定义多个方法：要求不仅可以求2个整数的最大值，还可以求3个小数的最大值
//    public static int maxNum(int num1, int num2) {
//        return (num1 > num2) ? num1 : num2;
//    }
//
//    public static double maxNum(double num1, double num2, double num3) {
//        return num3 > ((num1 > num2) ? num1 : num2) ? num3 : ((num1 > num2) ? num1 : num2);
//    }
//
//    public static void main(String[] args) {
//        double ret1 = maxNum(1.5, 2.6, 3.7);
//        System.out.println(ret1);
//        int ret2 = maxNum(1, 2);
//        System.out.println(ret2);
//    }

    //递归求 N 的阶乘
//    public static int fac(int n){
//        if (n == 1){
//            return 1;
//        }
//        return n * fac(n - 1);
//    }
//
//    public static void main(String[] args) {
//        int ret = fac(5);
//        System.out.println(ret);
//    }


    //递归求解汉诺塔问题
    //1个盘子 A -> C 2^1 - 1
    //2个盘子 A -> B  A -> C B -> C 2^2 - 1
    //3个盘子 A -> C  A -> B  C -> B  A -> C  B -> A  B -> C  A -> C 2^3 - 1
    //3个盘子的时候，需要先借助C柱，将从上往下的n-1个盘子移到B柱上
    //然后把A柱下最大的移到C柱上，然后，再借助A柱，把n-1个盘子移到C柱上
//    public static void move(char pos1, char pos2){
//        System.out.println(pos1 + "->" + pos2);
//    }
//
//    /**
//     *
//     * @param n 盘子的个数
//     * @param pos1 起始位置
//     * @param pos2 借助位置
//     * @param pos3 目标位置
//     */
//    public static void hanoi(int n, char pos1, char pos2, char pos3){
//        if (n == 1){
//            move(pos1, pos2);
//        }else {
//            hanoi(n-1, pos1, pos3, pos2);
//            move(pos1, pos3);
//            hanoi(n-1, pos2, pos1, pos3);
//        }
//    }
//
//    public static void main(String[] args) {
//        hanoi(3,'A', 'B', 'C');
//
//    }


    //青蛙跳台阶问题
    //当n>2时，第一次跳的时候就有两种不同的选择:
    // 是第一次仅仅跳1级)此时跳法数目等于后面剩下的n-1级台阶的跳法数目，即为f(n-1);
    // 还有一种选择是第一次跳2级，此时跳法数目等于后面剩下n-2级台阶的跳法数目，即为f(n-2)
//    public static int jumpFloor(int target){
//        if (target == 1){
//            return 1;
//        }else if(target == 2){
//            return 2;
//        }else {
//            return jumpFloor(target - 1) + jumpFloor(target - 2);
//        }
//    }
//
//    public static void main(String[] args) {
//        int ret = jumpFloor(40);
//        System.out.println(ret);
//    }
}